home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************/
- /* */
- /* TurboCAD for Windows */
- /* Copyright (c) 1993 - 2001 */
- /* International Microcomputer Software, Inc. */
- /* (IMSI) */
- /* All rights reserved. */
- /* */
- /******************************************************************/
-
- // propmodify.cpp : implementation file
- //
-
- #include "stdafx.h"
- #include "LTSample.h"
- #include "propmodify.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- #define W_EDIT 50
- #define H_EDIT 20
-
- void PutVoidToVariant(VARIANT& varVal, void* pvoid)
- {
- switch (varVal.vt)
- {
- case VT_I2:
- varVal.iVal = *((SHORT *)pvoid);
- break;
- case VT_I4:
- varVal.lVal = *((long *)pvoid);
- break;
- case VT_R4:
- varVal.fltVal = *((float *)pvoid);
- break;
- case VT_R8:
- varVal.dblVal = *((double *)pvoid);
- break;
- case VT_CY:
- varVal.cyVal = *((CY *)pvoid);
- break;
- case VT_DATE:
- varVal.date = *((DATE *)pvoid);
- break;
- case VT_BSTR:
- varVal.bstrVal = *((BSTR *)pvoid);
- break;
- case VT_BOOL:
- varVal.boolVal = *((BOOL *)pvoid);
- break;
- default:
- varVal.vt = VT_EMPTY;
- }
- }
-
- void PutVariantToVoid(void* pvoid, VARIANT& varVal)
- {
- switch (varVal.vt)
- {
- case VT_I2:
- *((SHORT *)pvoid) = varVal.iVal;
- break;
- case VT_I4:
- *((long *)pvoid) = varVal.lVal;
- break;
- case VT_R4:
- *((float *)pvoid) = varVal.fltVal;
- break;
- case VT_R8:
- *((double *)pvoid) = varVal.dblVal;
- break;
- case VT_CY:
- *((CY *)pvoid) = varVal.cyVal;
- break;
- case VT_DATE:
- *((DATE *)pvoid) = varVal.date;
- break;
- case VT_BSTR:
- *((BSTR *)pvoid) = varVal.bstrVal;
- break;
- case VT_BOOL:
- *((BOOL *)pvoid) = varVal.boolVal;
- break;
- default:
- ASSERT(FALSE);
- }
- }
-
-
- void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, VARIANT& varVal)
- {
- switch (varVal.vt)
- {
- case VT_I2:
- DDX_Text(pDX, nIDC, varVal.iVal);
- break;
- case VT_I4:
- DDX_Text(pDX, nIDC, varVal.lVal);
- break;
- case VT_R4:
- DDX_Text(pDX, nIDC, varVal.fltVal);
- break;
- case VT_R8:
- DDX_Text(pDX, nIDC, varVal.dblVal);
- break;
- case VT_CY:
- {
- COleCurrency cy(varVal.cyVal);
- DDX_Text(pDX, nIDC, cy);
- if (pDX->m_bSaveAndValidate)
- varVal.cyVal = cy;
- }
- break;
- case VT_DATE:
- {
- COleDateTime date(varVal.date);
- DDX_Text(pDX, nIDC, date);
- if (pDX->m_bSaveAndValidate)
- varVal.date = date;
- }
- break;
- case VT_BSTR:
- {
- CString cstrVal(varVal.bstrVal);
- DDX_Text(pDX, nIDC, cstrVal);
-
- if (pDX->m_bSaveAndValidate)
- {
- if (varVal.bstrVal != NULL)
- SysFreeString(varVal.bstrVal);
- varVal.bstrVal = cstrVal.AllocSysString();
- }
- }
- break;
- case VT_BOOL:
- {
- CString cstrText(varVal.boolVal ? "True" : "False");
-
- DDX_Text(pDX, nIDC, cstrText);
-
- if (pDX->m_bSaveAndValidate)
- {
- if (cstrText.CompareNoCase("True") == 0)
- varVal.boolVal = 1;
- else
- {
- if (cstrText.CompareNoCase("False"))
- varVal.boolVal = 0;
- else
- pDX->Fail();
- }
- }
- }
- break;
- default:
- varVal.vt = VT_EMPTY;
- pDX->Fail();
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CPropModify dialog
-
-
- CPropModify::CPropModify(COleVariant *pvarVal, LPCTSTR cszName, LPCTSTR cszType, CWnd* pParent /*=NULL*/)
- : CDialog(CPropModify::IDD, pParent)
- {
- m_cstrName = cszName;
- m_cstrType = cszType;
- ::VariantCopyInd(m_varVal, pvarVal);
- m_bInitDone = FALSE;
- //{{AFX_DATA_INIT(CPropModify)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- }
-
- void CPropModify::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- if (m_bInitDone)
- {
- int iUpper = m_arrWnd.GetUpperBound();
- CEdit *pEdit = NULL;
- UINT IDC_EDIT = IDC_VAL + 1;
- if (m_varVal.vt & VT_ARRAY)
- {
- long lLBound, lUBound;
- VARIANT varVal;
- ::VariantInit(&varVal);
-
- varVal.vt = m_varVal.vt & ~VT_ARRAY;
- UINT nSize = SafeArrayGetElemsize(m_varVal.parray);
- void *pelem = (void *)new BYTE[nSize];
-
- HRESULT hRes = SafeArrayGetLBound(m_varVal.parray, 1, &lLBound);
- ASSERT(SUCCEEDED(hRes));
- hRes = SafeArrayGetUBound(m_varVal.parray, 1, &lUBound);
- ASSERT(SUCCEEDED(hRes));
- for (long lItem = lLBound; lItem <= lUBound; lItem++)
- {
- if (pDX->m_bSaveAndValidate)
- {
- DDX_Text(pDX, IDC_EDIT, varVal);
- PutVariantToVoid(pelem, varVal);
- VERIFY(SUCCEEDED(SafeArrayPutElement(m_varVal.parray, &lItem, pelem)));
- }
- else
- {
- if (SUCCEEDED(SafeArrayGetElement(m_varVal.parray, &lItem, pelem)))
- {
- PutVoidToVariant(varVal, pelem);
- DDX_Text(pDX, IDC_EDIT, varVal);
- }
- }
-
- IDC_EDIT++;
- }
- delete[] pelem;
-
- }
- else
- {
- DDX_Text(pDX, IDC_EDIT, m_varVal);
- }
- }
- }
-
-
- BEGIN_MESSAGE_MAP(CPropModify, CDialog)
- //{{AFX_MSG_MAP(CPropModify)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CPropModify message handlers
-
- BOOL CPropModify::OnInitDialog()
- {
- CDialog::OnInitDialog();
-
- CStatic *pWnd = (CStatic *)GetDlgItem(IDC_NAME);
- if (pWnd != NULL)
- {
- pWnd->SetWindowText(m_cstrName);
- }
-
- pWnd = (CStatic *)GetDlgItem(IDC_TYPE);
- if (pWnd != NULL)
- {
- pWnd->SetWindowText(m_cstrType);
- }
-
- CRect rect;
- pWnd = (CStatic *)GetDlgItem(IDC_VAL);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(&rect);
-
- CRect rectEdit;
- CEdit *pEdit = NULL;
-
- rectEdit.top = rect.bottom + 2;
- rectEdit.bottom = rectEdit.top + H_EDIT;
- UINT IDC_EDIT = IDC_VAL + 1;
-
- if (m_varVal.vt & VT_ARRAY)
- {
- int dx = 0, dy = 0;
- UINT nDim = SafeArrayGetDim(m_varVal.parray);
- if (nDim > 1)
- {
- AfxMessageBox("IDS_CANNOTTPROCESSPROPERTYDATA");
- return FALSE;
- }
-
- long lLBound, lUBound;
- long max_dx = 0;
-
- HRESULT hRes = SafeArrayGetLBound(m_varVal.parray, 1, &lLBound);
- ASSERT(SUCCEEDED(hRes));
- hRes = SafeArrayGetUBound(m_varVal.parray, 1, &lUBound);
- ASSERT(SUCCEEDED(hRes));
- rectEdit.left = rect.left;
- for (long lItem = lLBound; lItem <= lUBound; lItem++)
- {
- pEdit = new CEdit();
- rectEdit.right = rectEdit.left + W_EDIT;
- pEdit->Create(WS_CHILD
- | WS_VISIBLE
- | WS_BORDER
- | ES_AUTOHSCROLL
- | ES_LEFT,
- rectEdit,
- this,
- IDC_EDIT);
-
- pEdit->SetFont(GetFont());
- m_arrWnd.Add(pEdit);
- rectEdit.left = rectEdit.right + 2;
- IDC_EDIT++;
- }
-
- }
- else
- {
- rectEdit.left = rect.left + (rect.Width() - W_EDIT) / 2;
- rectEdit.right = rectEdit.left + W_EDIT;
-
- pEdit = new CEdit();
- pEdit->Create(WS_CHILD
- | WS_VISIBLE
- | WS_BORDER
- | ES_AUTOHSCROLL
- | ES_LEFT,
- rectEdit,
- this,
- IDC_EDIT);
-
- pEdit->SetFont(GetFont());
-
- m_arrWnd.Add(pEdit);
- }
- m_bInitDone = TRUE;
- UpdateData(FALSE);
-
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
-
- BOOL CPropModify::DestroyWindow()
- {
- int iUpper = m_arrWnd.GetUpperBound();
- CEdit *pEdit = NULL;
- for (int iItem = 0; iItem <= iUpper; iItem ++)
- {
- pEdit = (CEdit *)m_arrWnd.GetAt(iItem);
- m_arrWnd.SetAt(iItem, NULL);
-
- if (pEdit != NULL)
- delete pEdit;
-
- pEdit = NULL;
- }
-
-
- return CDialog::DestroyWindow();
- }
-